/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logica;

import dao.LecturaDAO;
import dao.SustratoDAO;
import java.util.List;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import modelo.GrupoLectura;
import modelo.Lectura;
import vista.panel.Mensajes;

/**
 *
 * @author Elias Mendoza
 */
public class EstadoRiego_Dia extends Thread {
  
  
 
  private JProgressBar barraRiegoAlDia;
  
  private Object[] filaTablaResumen;
  private Object[] filaTablaEstadoValvula;
  
  private List listArray;
  private DefaultTableModel modeloTablaResumen = new DefaultTableModel();
  private DefaultTableModel modeloTablaEstadoValvula = new DefaultTableModel();
  
  private String[] sustratos;
 

  public EstadoRiego_Dia(JProgressBar barraRiegoAlDia, JTable tablaResumen, JTable tablaEstadoValvula,String[] sustratos) {
    this.barraRiegoAlDia = barraRiegoAlDia;
    barraRiegoAlDia.setMaximum(100);
    barraRiegoAlDia.setMinimum(0);
    barraRiegoAlDia.setStringPainted(true);
    barraRiegoAlDia.setValue(0);
    inicializaTabla(tablaResumen, tablaEstadoValvula);
    this.sustratos = sustratos;
    this.start();
  }



  public void inicializaTabla(JTable tablaResumen,JTable tablaEstadoValvula) {
    //Inicializando la tabla de Resumen
    tablaResumen.setModel(modeloTablaResumen);
    modeloTablaResumen.addColumn("Humedad(%)");
    modeloTablaResumen.addColumn("Sustrato");
    modeloTablaResumen.addColumn("Estado/Riego");
    modeloTablaResumen.addColumn("No Valvulas");
    modeloTablaResumen.addColumn("No. Sensores");
    modeloTablaResumen.addColumn("No. Registros");
    modeloTablaResumen.addColumn("No. Lecturas");
    modeloTablaResumen.addColumn("Aperturas/Valvula");
    modeloTablaResumen.addColumn("Riego acumulado");
    filaTablaResumen = new Object[9];
    //Inicializando la tabla del estado de valvulas
    tablaEstadoValvula.setModel(modeloTablaEstadoValvula);
    modeloTablaEstadoValvula.addColumn("Sustrato");
    modeloTablaEstadoValvula.addColumn("Regando(grupos)");
    modeloTablaEstadoValvula.addColumn("No regando(grupos)");
    filaTablaEstadoValvula = new Object[3];
  }
  
    private void addFilaTablaResumen(float humedad, String sustrato, String estadoRiego, int numValvulas,int numSensores, int numRegistros, int numTotalLecturas, int numAperturas, float gastoAcumulado) {
    filaTablaResumen[0] = String.format("%.2f", humedad);
    filaTablaResumen[1] = sustrato;
    filaTablaResumen[2] = estadoRiego;
    filaTablaResumen[3] = numValvulas;
    filaTablaResumen[4] = numSensores;
    filaTablaResumen[5] = numRegistros;
    filaTablaResumen[6] = numTotalLecturas;
    filaTablaResumen[7] = numAperturas;
    filaTablaResumen[8] = gastoAcumulado;
    modeloTablaResumen.addRow(filaTablaResumen);
  }
    
  public void addFilaTablaEstadoValvula(String nombreSustrato,String regando, String noRegando){
    filaTablaEstadoValvula[0] = nombreSustrato;
    filaTablaEstadoValvula[1] = regando;
    filaTablaEstadoValvula[2] = noRegando;
    modeloTablaEstadoValvula.addRow(filaTablaEstadoValvula);
  }

  public void calculaHumedadDelDia() {
    LecturaDAO lecturaDAO = new LecturaDAO();
    SustratoDAO sustratoDAO = new SustratoDAO();
    FechaHora fh = new FechaHora();
    listArray = sustratoDAO.getListArrayCriteria(sustratos);
    List listLecturas = lecturaDAO.LecturaDiaCriteria(fh.getFecha(),sustratos);
    barraRiegoAlDia.setMaximum(listLecturas.size());
    //JOptionPane.showMessageDialog(null, "el tamaño de la lista de lecturas es de: "+listLecturas.size());
    Lectura l;
    int i = 1;
    for (Object obj : listLecturas) {
      barraRiegoAlDia.setValue(i++);
      l = (Lectura) obj;
      asignaToArraySumaLectura(l.getSustrato().getId(), l.sumaLecturas());
      for (GrupoLectura gl : l.getGrupoLectura()) {
        System.out.println("El grupo es´: "+gl.getPrimaryKey().getGrupoFK().getGrupo());
        System.out.println("Le gasto del grupo es: "+gl.getPrimaryKey().getGrupoFK().getGasto());
        asignaToArrayGastoAcumulado(l.getSustrato().getId(), gl.getEstadoValvula(),gl.getPrimaryKey().getGrupoFK().getGasto());
      }
    }
    asignaToArrayEstadoActualValvula();
    llenaTablaResumen();
    llenaTablaEstadoValvula();
  }

  public void asignaToArraySumaLectura(int idSustrato, float sumaLectura) {
    for (Object obj : listArray) {
      Object[] array = (Object[]) obj;
      int id = (Integer) array[0];
      if (id == idSustrato) {
        array[4] = (Integer) array[4] + 1;//incrementa en uno el numero de registro de lecturas
        array[5] = Float.parseFloat(array[5].toString()) + sumaLectura;//suma el total de lecturas de los sensores al valor actual de suma
        break;
      }
    }
  }

  public void asignaToArrayGastoAcumulado(int idSustrato, int estadoValvula,float gasto) {
    for (Object obj : listArray) {
      Object[] array = (Object[]) obj;
      int id = (Integer) array[0];
      if (id == idSustrato) {
 
        if (estadoValvula == 1) {
          array[6] = (Integer) array[6] + 1;//si la valvula fue abierta en esta lectura se suma uno
          array[7] = Float.parseFloat(array[7].toString()) + gasto;//se suma el gasto acumulado
        }
        break;
      }
    }
  }
  
  public void asignaToArrayEstadoActualValvula() {
    FechaHora fh = new FechaHora();
    LecturaDAO lecturaDAO = new LecturaDAO();
    List listLecturas = lecturaDAO.consultaEstadoValvula(lecturaDAO.consultaUltHoraCriteria(fh.getFecha(),sustratos));
    for (Object lec : listLecturas) {
      Lectura l = (Lectura) lec;
      for (GrupoLectura gl : l.getGrupoLectura()) {
        System.out.println("estado de valvula: " + gl.getEstadoValvula());
        if (gl.getEstadoValvula() == 1) {
          System.out.println("estado de valvula: " + gl.getEstadoValvula());
          for (Object obj : listArray) {
            Object[] array = (Object[]) obj;
            int id = (Integer) array[0];
            if (id == l.getSustrato().getId()) {
              System.out.println("grupo que sera aderido a regando: " + gl.getPrimaryKey().getGrupoFK().getGrupo());
              array[8] = array[8].toString() + "[" + gl.getPrimaryKey().getGrupoFK().getGrupo() + "]";
              System.out.println("arreglo de los regados " + array[8]);
            }
          }
        } else {
          for (Object obj : listArray) {
            Object[] array = (Object[]) obj;
            int id = (Integer) array[0];
            if (id == l.getSustrato().getId()) {
              System.out.println("grupo que sera aderido a No regando: " + gl.getPrimaryKey().getGrupoFK().getGrupo());
              array[9] = array[9].toString() + "[" + gl.getPrimaryKey().getGrupoFK().getGrupo() + "]";
              System.out.println("arreglo de los No regados " + array[8]);
            }
          }
        }
      }
    }

  }
          
       
  public void llenaTablaResumen() {
    for (Object obj : listArray) {
      Object[] array = (Object[]) obj;
      int numTotalLectura = ((Integer) array[4] * 4) * (new Integer(array[1].toString()));
      int numSensores = ((Integer) array[1] * 4);
      float sumaLecturas = (Float.parseFloat(array[5].toString()));
      float referenciaOptima = (Float.parseFloat(array[3].toString()));
      float humedad = (sumaLecturas / numSensores) * 100 / referenciaOptima;
      String nombreSustrato = (String) array[2].toString();
      int numValvulas = Integer.parseInt(array[1].toString());
      int numRegistros = (Integer) array[4];
      int numAperturas = (Integer) array[6];
      float gastoAcumulado = Float.parseFloat(array[7].toString());
      String estadoRiego = "No Regando";
      if(!array[8].toString().equals(""))
        estadoRiego = "Regando";
      addFilaTablaResumen(humedad, nombreSustrato,estadoRiego, numValvulas,numSensores, numRegistros, numTotalLectura, numAperturas, gastoAcumulado);
    }
  }
  public void llenaTablaEstadoValvula(){
    for(Object obj:listArray){
      Object[] array = (Object[]) obj;
      String nombreSustrato = (String) array[2].toString();
      String regando = (String) array[8].toString();
      String noRegando = (String) array[9].toString();
      addFilaTablaEstadoValvula(nombreSustrato, regando, noRegando);
    }
  }

  @Override
  public void run() {
    calculaHumedadDelDia();
  }
}
